package javaCode.chapter09.innerclass;

/**
 * 演示局部内部类的使用
 */
public class LocalInnerClass {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        outer02.m1();
        System.out.println("Outer02 hashcode=" + outer02);
    }
}

class Outer02 { //外部类
    private int n1 = 100;

    private void m2() {
        System.out.println("Outer02 m2()");
    }

    public void m1() { //方法
        //1、局部内部类是定义在外部类的局部位置，通常在方法
        //3、不能添加修饰符，但可以使用final修饰
        //4、作用域：仅仅在定义它的方法和代码块中
        class Inner02 { //局部内部类(本质还是一个类）
            //2、可以直接访问外部类的所有成员，包括私有的
            //5、局部内部类可以直接访问外部类的成员，比如下面 外部类m2() 和 n1
            //7、如果外部类和局部内部成员重名时，默认遵守就近原则，
            // 如果想访问外部类的成员，则可以使用 (外部类名.this.成员)
            // 解读 Outer.this.n1 本质就是外部类的对象，即哪个对象调用了m1，这个Outer02.this 就是谁
            private int n1 = 10;
            final public void f1() {
                System.out.println("n1=" + n1 + " 外部类的n1=" + Outer02.this.n1);
                System.out.println("Outer02.this hashcode=" + Outer02.this);
                m2();
            }
        }
        //6、外部类在方法中，可以创建Inner02对象，然后调用方法即可
        Inner02 inner02 = new Inner02();
        inner02.f1();
    }

    { //代码块
        class Inner03 {

        }
    }
}